<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Андрей
 * Date: 10.05.12
 * Time: 20:26
 * To change this template use File | Settings | File Templates.
 */

    /*
     * Класс для работы с базой данных
     * по паттерну Data Object Access
     */

    abstract class DAOBaseAbstract
    {
        // ресурсы подключения
        protected  static $_dbResource;
        private static $_selectedDB;

        // наследники должны
        // установить соответсвующие значения
        protected $_tableName;
        protected $_primaryKey;

        /*
         * В конструкторе производится
         * подключение к дб
         */
        public function __construct()
        {
            $this->_connectDB('localhost','root','','blog');
        }

        /*
         * подключение к БД
         * создается только одно подключение на весь сценарий
         */
        private function _connectDB($host,$user,$password,$table)
        {
            if ( null == self::$_dbResource )
            {
                if ( !is_resource(self::$_dbResource = @mysql_connect($host,$user,$password)) )
                {
                    die("Ошибка подключения к базе данных");
                } else{

                    if ( !( self::$_selectedDB = @mysql_select_db($table,self::$_dbResource) ) ) /// выбрать БД
                    {
                       die('Ошибка подключения к талице');
                    }
                }

            } else{
                
                if ( is_resource(self::$_dbResource) )
                    return true;
            }
        }

        public function disconnectDb()
        {
            @mysql_close(self::$_dbResource);
        }

        /*
         * mysql_real_escape
         */
        public function escape($value)
        {
            // если не экранируются автоматически
            if (! get_magic_quotes_gpc() )
            {
                $value = mysql_real_escape_string($value);
            }

            return $value;
        }


        /*
         * INSERT
         * в $keyedArray подаются пары ключ -> значение
         * где ключ - имя столбцы, значение - значение поля =)
         */

        public function insert($keyedArray)
        {
            $query = "INSERT INTO {$this->_tableName} ";

            $keys = array();
            $values = array();

            foreach($keyedArray as $key => $value)
            {
                $keys[] = $key;
                $values[] = "'" . $this->escape($value) . "'";
            }

            $keys = '(' . implode(',',$keys) . ') ';
            $values = 'VALUES(' . implode(',',$values) . ')';

            $query .= $keys;
            $query .= $values;

            
            if (! @mysql_query($query, self::$_dbResource) )
            {
                return false;
                //die("Ошибка вставки " . mysql_error());
            }

            return true;
            
        }
        /*
         *  SELECT
         *  Выборка из таблицы по _primaryKey
         *  его можно менять(второй параметр)
         */

        
        public function select($value, $key = NULL, $limit = null)
        {
            if ( null == $key )
            {
                $key = $this->_primaryKey;
            }

            // формирование запроса
            $query = " SELECT * FROM {$this->_tableName} WHERE {$key} = '" . $this->escape($value) . "'
                       ORDER BY {$this->_primaryKey} DESC";

            // если стоит ограничение
            if ($limit != null)
                $query .= "\nLIMIT " . $limit;

            if ( !$results = @mysql_query($query, self::$_dbResource) )
            {
                return false;
            }

            $rows = array();

            while ($result = mysql_fetch_assoc($results))
            {
                $rows[] = $result;
            }

            return $rows;
        }

        /*
         * DELETE
         */

        public function delete($value, $key = null)
        {
            if ( null == $key )
            {
                $key = $this->_primaryKey;
            }
            
            $query = "DELETE FROM {$this->_tableName}
                      WHERE {$key} = '{$value}'";

            if (! @mysql_query($query, self::$_dbResource) )
            {
                return false;
                //die("Ошибка удаления " . mysql_error());
            }

            return true;
        }

        /*
         * UPDATE
         * как и в INSERT
         */

        public function update($keyedArray)
        {
            $query = "UPDATE {$this->_tableName} SET ";

            $updates = array();
            foreach ($keyedArray as $column => $value)
            {
                $updates[] = "{$column} = '" . $this->escape($value) . "' ";
            }

            $query .= implode(',', $updates);
            $query .= "WHERE {$this->_primaryKey }= '{$keyedArray[$this->_primaryKey]}' ";
            
            if (! @mysql_query($query, self::$_dbResource) )
            {
                return false;
                //die("Ошибка обновления " . mysql_error());
            }

            return true;
        }

        /*
         * last insert id
         */

        public function lastInsertId()
        {
            return mysql_insert_id(self::$_dbResource);
        }

        /*
         * запрос в некоторых случаях понадобиться
         */
        public function query($query)
        {
            return @mysql_query($query, self::$_dbResource);
        }
        
    }
